package main

import "fmt"

func main() {

	// 数组定义
	// var array01 [10] int
	var array02 = [5]int{1, 2, 3, 4, 5}

	fmt.Println(array02)

	fmt.Println("array02 len: ", len(array02))
	// 遍历数组
	for i := 0; i < len(array02); i++ {
		fmt.Println(array02[i])
	}
	// for range 遍历数组
	for _, a := range array02 {
		fmt.Println(a)
	}

	// 多维数组
	/*

	   一维数组：存储的多个数据是数值本身
	       a1 :=[3]int{1,2,3}

	   二维数组：存储的是一维的一维
	       a2 := [3][4]int{{},{},{}}

	       该二维数组的长度，就是3。
	       存储的元素是一维数组，一维数组的元素是数值，每个一维数组长度为4。

	   多维数组：。。。

	*/
	a2 := [3][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}
	fmt.Println(a2)
	fmt.Printf("二维数组的地址：%p\n", &a2)
	fmt.Printf("二维数组的长度：%d\n", len(a2))

	fmt.Printf("一维数组的长度：%d\n", len(a2[0]))
	fmt.Println(a2[0][3]) // 4
	fmt.Println(a2[1][2]) //7
	fmt.Println(a2[2][1]) // 10

	//遍历二维数组
	for i := 0; i < len(a2); i++ {
		for j := 0; j < len(a2[i]); j++ {
			fmt.Print(a2[i][j], "\t")
		}
		fmt.Println()
	}

	fmt.Println("---------------------")
	//for range 遍历二维数组
	for _, arr := range a2 {
		for _, val := range arr {
			fmt.Print(val, "\t")
		}
		fmt.Println()
	}

	/**
	 * Go中的数组是值类型，而不是引用类型。这意味着当它们被分配给一个新变量时，将把原始数组的副本分配给新变量
	 */

	a := [...]string{"USA", "China", "India", "Germany", "France"}
	b := a // a copy of a is assigned to b
	b[0] = "Singapore"
	fmt.Println("a is ", a)
	fmt.Println("b is ", b)

	// 定义稀疏数组
	// 将第100个元素(下标值为99)的值赋值为39，其余元素值均为0
	var arr04 = [...]int{99: 39}
	fmt.Printf("%T\n", arr04)

}
